/*
 * Copyright (c) 2007 Aleksey Nikiforov
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 * * Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 *
 * * Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 *
 * * Neither the name of 'Aleksey Nikiforov' nor the names of other contributors 
 *   may be used to endorse or promote products derived from this software 
 *   without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package org.lex.util;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import com.jme.image.Image;
import com.jme.image.Texture;
import com.jme.util.TextureManager;

/**
 * This class helps loading multiple textures with the same properties.
 * This class loads textures from the directory or a zip file configured
 * at initialization time.
 * 
 * @author lex
 *
 */
public class DirectoryTextureLoader {

	private UrlFactory urlFactory;
	private boolean zip;
	private URL url;
	
	private TextureLoader textureLoader;
	
	public DirectoryTextureLoader(URL base, boolean zip) {
		this(base, zip, new TextureLoader());
	}
	
	public DirectoryTextureLoader(URL base, boolean zip,
			TextureLoader textureLoader)
	{
		url = base;
		this.zip = zip;
		urlFactory = new UrlFactory(base, zip);
		this.textureLoader = textureLoader;
	}
	
	public TextureLoader getTextureLoader() {
		return textureLoader;
	}
	
	/**
	 * Change the texture loader to fine tune texture properties, such
	 * as filtering and imageType.
	 * 
	 * @param textureLoader the textureLoader to use
	 */
	public void setTextureLoader(TextureLoader textureLoader) {
		this.textureLoader = textureLoader;
	}
	
	public Texture loadTexture(String file) throws IOException {
		URL imageUrl = urlFactory.makeUrl(file);
		Texture cached = textureLoader.getImageFromCache(imageUrl);
		if (cached != null) return cached;
		
		Image image;
		
		if (zip) {
			
			ZipInputStream zis = new ZipInputStream(url.openStream());
			ZipEntry entry;
			boolean found = false;
			
			while ((entry = zis.getNextEntry()) != null) {
				if (file.equals(entry.getName())) {
					found = true;
					break;
				}
			}
			
			if (!found) {
				throw new IOException("Cannot find file \"" + file + "\".");
			}
			
			int extIndex = file.lastIndexOf('.');
			if (extIndex == -1) {
				throw new IOException("Cannot parse file extension.");
			}
			String fileExt = file.substring(extIndex);
			
			// TextureManager.loadImage will close the stream.
			image = TextureManager.loadImage(fileExt, zis, true);
			
		} else {
			
			image = TextureManager.loadImage(imageUrl, true);
		}
		
		return textureLoader.loadTexture(imageUrl, image);
	}
	
	public URL makeUrl(String file) throws MalformedURLException {
		return urlFactory.makeUrl(file);
	}
	
}
